package com.qkbb.admin.kuibu.qkbb.funcation;

import android.graphics.Bitmap;
import android.util.Log;
import android.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;

public class MyImageCache implements ImageCache {

	private Map<String, SoftReference<Bitmap>> softMap = null;

	private static MyImageCache myImageCache = null;

	private MyImageCache() {
		softMap = new HashMap<String, SoftReference<Bitmap>>();
	}

	public static MyImageCache getMyImageCache() {
		if (myImageCache == null) {
			myImageCache = new MyImageCache();
		}
		return myImageCache;
	}

	// 计算出内存的1/8
	private int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);

	// 把内存的1/8作为图片缓冲区
	private MyLruCache myLruCache = new MyLruCache(maxSize);

	// 当get为null时，就去磁盘上找，在磁盘上没找到，就去网络上找。
	@Override
	public Bitmap getBitmap(String url) {
		// TODO Auto-generated method stub
		Bitmap bitmap = myLruCache.get(url);
		if (bitmap != null) {

			return bitmap;
		} else {
			// 获取url对应的软引用
			SoftReference<Bitmap> softReference = softMap.get(url);
			// 如果软引用不是空
			if (softReference != null) {
				// 获取软引用中的bitmap
				Log.e("磁盘", "");
				bitmap = softReference.get();
				// 如果获取到了
				if (bitmap != null) {
					// 返回这个bitmap
					myLruCache.put(url, bitmap);
					softMap.remove(url);
					return bitmap;
				}
			}
		}
		return null;
	}

	// 网络访问或者磁盘访问后，put
	@Override
	public void putBitmap(String url, Bitmap bitmap) {
		// TODO Auto-generated method stub
		myLruCache.put(url, bitmap);

	}

	class MyLruCache extends LruCache<String, Bitmap> {

		public MyLruCache(int maxSize) {
			super(maxSize);
			// TODO Auto-generated constructor stub
		}

		// 计算每一个对象的大小的方法
		@Override
		protected int sizeOf(String key, Bitmap value) {
			// TODO Auto-generated method stub
			return value.getByteCount();
		}

		// 当有对象被移除的时候回调此方法
		// 有对象被移除分为两种情况
		// 当evicted为真时，newValue为空，此时为缓冲区大小不够用，有新的对象进来。
		// 当evicted为假时，newValue不为空，此时为键值同名对象的替换。
		@Override
		protected void entryRemoved(boolean evicted, String key,
				Bitmap oldValue, Bitmap newValue) {
			if (evicted) {
				// oldValue->软引用里
				SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(
						oldValue);
				softMap.put(key, softReference);
			}
		}

	}

}
